home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / MISCEOUS / YRCAL17T.LZH / YEARCAL.C next >
Text File  |  1989-10-02  |  26KB  |  791 lines

  1. /********************************************************************
  2. **  YEARCAL.C v0.17T  Copyright (c) 1987, 1988, 1989 by Paul M. Sittler.
  3. **  All rights reserved.  The copyright owner hereby authorizes the
  4. **  no-charge, noncommercial making and/or distribution of copies of
  5. **  the entirety of this work unchanged and unincorporated in any
  6. **  other work (except "LiBRary" or "ARChive" disk files for the sole
  7. **  purpose of no-charge noncommercial distribution).  No other
  8. **  reproduction or use is authorized without the express prior
  9. **  written consent of the copyright owner.
  10. **
  11. **************************************************************/
  12.  
  13. /* ANSI header files included:  */
  14. #include <stdio.h>    /* fclose, fopen, fp, fprintf, fputs, */
  15.             /* gets, printf, rename, sprintf, stderr */
  16. #include <ctype.h>    /* toupper */
  17. #include <fcntl.h>    /* O_BINARY, O_RDWR */
  18. #include <io.h>        /* close, lseek, open, read, write */
  19. #include <stdlib.h>    /* exit */
  20. #include <string.h>    /* memset, strcat, strcmp, strcpy, strlen */
  21.  
  22. /* Turbo-C Header files included:  */
  23. #include <conio.h>    /* getch, putch */
  24. #include <dos.h>    /* DOS-specific file from Borland */
  25.  
  26. #include "yearcal.def"
  27.  
  28. struct options Opt;    /* Defined in YEARCAL.DEF, Declared here */
  29.  
  30. extern int directvideo = 0;    /* Gag me with a spoon! */
  31.                 /* An "enhancement" of Turbo-c v1.5, v2.0 */
  32.                 /* 0 = use BIOS calls */
  33.                 /* 1 = write to video ram for PC-Compats */
  34.                 /* For MSDOS generic, this must now be zero.*/
  35.                 /* And it STILL doesn't work!! */
  36.                 /* The getch function generates wild */
  37.                 /* interrupts on a Z-100 */
  38.  
  39. /* Suppress some library functions to conserve space */
  40. /* void _setargv () {}
  41.  * void _setenvp () {}
  42.  */
  43.  
  44. /* ---- array of border character sets ------ */
  45. struct LineDraw bcs[] =
  46. { /*  nw,  ne,  se,  sw, sid, lin,  ni, Ascii Characters top, sides */
  47.     {'-', '-', '-', '-', '|', '-', '-',
  48.   /*  si,  wi,  ei,  ns,  ew, isi, cross */
  49.      '-', '|', '|', '|', '-', '-', '-'},
  50.   /*  nw,  ne,  se,  sw, sid, lin,  ni, 1-line top, sides, inside */
  51.     {218, 191, 217, 192, 179, 196, 194,
  52.   /*  si,  wi,  ei,  ns,  ew, isi, cross */
  53.      193, 195, 180, 179, 196, 193, 197},
  54.   /*  nw,  ne,  se,  sw, sid, lin,  ni, 2-line top, sides, 1-line inside */
  55.     {201, 187, 188, 200, 186, 205, 209,
  56.   /*  si,  wi,  ei,  ns,  ew, isi, cross */
  57.      207, 199, 182, 179, 196, 193, 197},
  58.   /*  nw,  ne,  se,  sw, sid, lin,  ni, 2-line top, sides, inside */
  59.     {201, 187, 188, 200, 186, 205, 203,
  60.   /*  si,  wi,  ei,  ns,  ew, isi, cross */
  61.      202, 204, 185, 186, 205, 202, 206},
  62.   /*  nw,  ne,  se,  sw, sid, lin,  ni, 1-line top, 2-line sides, 1-line mid */
  63.     {214, 183, 189, 211, 186, 196, 210,
  64.   /*  si,  wi,  ei,  ns,  ew, isi, cross */
  65.      208, 199, 182, 186, 196, 193, 215},
  66.   /*  nw,  ne,  se,  sw, sid, lin,  ni, 2-line top, 1-line sides, 1-line mid */
  67.     {213, 184, 190, 212, 179, 205, 209,
  68.   /*  si,  wi,  ei,  ns,  ew, isi, cross */
  69.      207, 198, 181, 179, 205, 193, 216},
  70.   /*  nw,  ne,  se,  sw, sid, lin,  ni, 1-line top, 2-line sides, 2-line mid */
  71.     {214, 183, 189, 211, 186, 196, 210,
  72.   /*  si,  wi,  ei,  ns,  ew, isi, cross */
  73.      208, 204, 185, 186, 205, 202, 206},
  74.   /*  nw,  ne,  se,  sw, sid, lin,  ni, 2-line top, 1-line sides, 2-line mid */
  75.     {213, 184, 190, 212, 179, 205, 203,
  76.   /*  si,  wi,  ei,  ns,  ew, isi, cross */
  77.      202, 198, 181, 186, 205, 202, 206}
  78. };
  79.  
  80.  
  81. /* Put month's lengths into array of structures */
  82. struct month mon[] =
  83.     {
  84.     { 31, 0}, { 28, 0}, { 31, 0},
  85.     { 30, 0}, { 31, 0}, { 30, 0},
  86.     { 31, 0}, { 31, 0}, { 30, 0},
  87.     { 31, 0}, { 30, 0}, { 31, 0}
  88.     };
  89.  
  90. int lingos = 33;    /* Available languages */
  91.  
  92.  
  93.  
  94. /* Put names of langages into array */
  95. char *lingo[] =
  96.     {
  97.     "Afrikaans",        /*  0 */
  98.     "Arabic",        /*  1 */
  99.     "Cantonese",        /*  2 */
  100.     "Czech",        /*  3 */
  101.     "Danish",        /*  4 */
  102.     "Dutch",        /*  5 */
  103.     "English",        /*  6 */
  104.     "Esperanto",        /*  7 */
  105.     "Finnish",        /*  8 */
  106.     "French",        /*  9 */
  107.     "Gaelic",        /* 10 */
  108.     "German",        /* 11 */
  109.     "Greek",        /* 12 */
  110.     "Hebrew",        /* 13 */
  111.     "Hungarian",        /* 14 */
  112.     "Indonesian",        /* 15 */
  113.     "Irish",        /* 16 */
  114.     "Italian",        /* 17 */
  115.     "Japanese",        /* 18 */
  116.     "Korean",        /* 19 */
  117.     "Mandarin",        /* 20 */
  118.     "Norwegian",        /* 21 */
  119.     "Polish",        /* 22 */
  120.     "Portugese",        /* 23 */
  121.     "Romanian",        /* 24 */
  122.     "Russian",        /* 25 */
  123.     "Serbo-Croatian",    /* 26 */
  124.     "Spanish",        /* 27 */
  125.     "Swahili",        /* 28 */
  126.     "Swedish",        /* 29 */
  127.     "Texan",        /* 30 */
  128.     "Turkish",        /* 31 */
  129.     "Yiddish"        /* 32 */
  130.     } ;
  131.  
  132.  
  133.  
  134. /* Put names of months into array */
  135. char *mnam[][12] =
  136.        {
  137. /* Afrikaans    0 */  "JANUARI",    "FEBRUARI",    "MAART",     "APRIL",
  138.               "MEI",        "JUNI",        "JULI",      "AUGUSTUS",
  139.               "SEPTEMBER",  "OKTOBER",     "NOVEMBER",  "DECEMBER",
  140. /* Arabic    1 */  "YANAYIR",    "FIBRAYER",    "MARIS",     "ABRIL",
  141.               "MAYO",       "YOUNYA",      "YOULYA",    "AGHOUSTOUSS",
  142.               "SEPTEMBAR",  "OKTOBAR",     "NOUVEMBAR", "DISEMBAR",
  143. /* Cantonese    2 */  "YAT YUET",   "YEE YUET",    "SAAM YUET", "SAY YUET",
  144.               "NG YUET",    "LOOK YUET",   "CHAT YUET", "BAAT YUET",
  145.         "GAU YUET",   "SUP YUET",    "SUP-YAT YUET","SUP-YEE YUET",
  146. /* Czech    3 */  "LEDEN",      "UNOR",        "BREZEN",    "DUBEN",
  147.               "KVETEN",     "CERVEN",      "CERVENEC",  "SRPEN",
  148.               "ZARI",       "RIJEN",       "LISTOPAD",  "PROSINEC",
  149. /* Danish    4 */  "JANUAR",     "FEBRUAR",     "MARTS",     "APRIL",
  150.               "MAJ",        "JUNI",        "JULI",      "AUGUST",
  151.               "SEPTEMBER",  "OKTOBER",     "NOVEMBER",  "DECEMBER",
  152. /* Dutch    5 */  "JANUARI",    "FEBRUARI",    "MAART",     "APRIL",
  153.               "MEI",        "JUNI",        "JULI",      "AUGUSTUS",
  154.               "SEPTEMBER",  "OKTOBER",     "NOVEMBER",  "DECEMBER",
  155. /* English    6 */  "JANUARY",    "FEBRUARY",    "MARCH",     "APRIL",
  156.               "MAY",        "JUNE",        "JULY",      "AUGUST",
  157.               "SEPTEMBER",  "OCTOBER",     "NOVEMBER",  "DECEMBER",
  158. /* Esperanto    7 */  "JANUARO",    "FEBRUARO",    "MARTO",     "APRILO",
  159.               "MAJO",       "JUNIO",       "JULIO",     "AUGUSTO",
  160.               "SEPTEMBRO",  "OKTOBRO",     "NOVEMBRO",  "DECEMBRO",
  161. /* Finnish    8 */  "TAMMIKUU",   "HELMIKUU",    "MAALISKUU", "HUHTIKUU",
  162.               "TOUKOKUU",   "KESAKUU",     "HEINAKUU",  "ELOKUU",
  163.               "SYYSKUU",    "LOKAKUU",     "MARRASKUU", "JOULUKUU",
  164. /* French    9 */  "JANVIER",    "FEVRIER",     "MARS",      "AVRIL",
  165.               "MAI",        "JUIN",        "JUILLET",   "AOUT",
  166.               "SEPTEMBRE",  "OCTOBRE",     "NOVEMBRE",  "DECEMBRE",
  167. /* Gaelic    10 */ "FAOILTEACH", "GEARRAN",        "MART",      "GIBLEAN",
  168.               "CEITEAN",    "T-OG-MHIOS",  "T-IUCHAR",  "LUNASDAL",
  169.               "T-SULTAINN", "DAMHAR",      "T-SAMHAINN","DUDLACHD",
  170. /* German    11 */ "JANUAR",     "FEBRUAR",     "MAERZ",     "APRIL",
  171.               "MAI",        "JUNI",        "JULI",      "AUGUST",
  172.               "SEPTEMBER",  "OKTOBER",     "NOVEMBER",  "DEZEMBER",
  173. /* Greek    12 */ "IANOUA'RIOS","FEVROUA'RIOS","MAR'TIOS",  "APRI'LIOS",
  174.               "MA'IOS",     "IOU'NIOS",    "IOU'LIOS",  "AV'GOUSTOS",
  175.               "SEPTEM'VRIOS","OKTO'VRIOS", "NOEM'VRIOS","DEKEM'VRIOS",
  176. /* Hebrew    13 */ "YANUAR",     "FEBRUAR",     "MERTS",     "APRIL",
  177.               "MAY",        "YUNI",        "YULI",      "AVGUST",
  178.               "SEPTEMBER",  "OKTOBER",     "NOVEMBER",  "DETSEMBER",
  179. /* Hungarian    14 */ "JANUAR",     "FEBRUAR",     "MARCIUS",   "APRILIS",
  180.               "MAJUS",      "JUNIUS",      "JULIUS",    "AUGUSZTUS",
  181.               "SZEPTEMBER", "OKTOBER",     "NOVEMBER",  "DECEMBER",
  182. /* Indonesian    15 */ "DJANUARI",   "FEBRUARI",    "MARET",     "APRIL",
  183.               "MAI",        "DJUNI",       "DJUI",      "AUGUSTUS",
  184.               "SEPTEMBER",  "OKTOBER",     "NOPEMBER",  "DESEMBER",
  185. /* Irish    16 */ "EANAIR",     "FEABHRA",     "MARTA",     "TABREAN",
  186.               "BHEALTAINE", "MEITHEAMH",   "IUIL",      "LUNASA",
  187.     "MEAN FHOMHAIR","DEIREADH FOMHAIR","MI NA SAMHNA","MI NA NOLLAG",
  188. /* Italian    17 */ "GENNAIO",    "FEBBRAIO",    "MARZO",     "APRILE",
  189.               "MAGGIO",     "GIUGNIO",     "LUGLIO",    "AGOSTO",
  190.               "SETTEMBRE",  "OTTOBRE",     "NOVEMBRE",  "DICEMBRE",
  191. /* Japanese    18 */ "ICHIGATSU",  "NIGATSU",     "SANGATSU",  "SHIGATSU",
  192.               "GOGATSU",    "ROKUGATSU",   "SHICHIGATSU","HACHIGATSU",
  193.               "KUGATSU",    "JUGATSU",     "JUICHIGATSU","JUNIGATSU",
  194. /* Korean    19 */ "IL-WOL",     "I-WOL",       "SAM-WOL",   "SA-WOL",
  195.               "O-WOL",      "YU-WOL",      "CH'IL-WOL", "P'AL-WOL",
  196.               "KU-WOL",     "SI-WOL",      "SIP IL-WOL","SIP I-WOL",
  197. /* Latin          "JANUARIUS",  "FEBRUARIUS",  "MARTIUS",   "APRILIS",
  198.               "MAIUS",      "JUNIUS",      "JULIUS",    "AUGUSTUS",
  199.               "SEPTEMBER",  "OCTOBER",     "NOVEMBER",  "DECEMBER", */
  200. /* Mandarin    20 */  "YI YUE",    "ER YUE",      "SAN YUE",   "SI YUE",
  201.                "WU YUE",    "LIU YUE",     "QI YUE",    "BA YUE",
  202.                "JIU YUE",   "SHI YUE",     "SHI YI YUE","SI ER YUE",
  203. /* Norwegian    21 */  "JANUAR",    "FEBRUAR",     "MARS",      "APRIL",
  204.                "MAI",       "JUNI",        "JULI",      "AUGUST",
  205.                "SEPTEMBER", "OKTOBER",     "NOVEMBER",  "DESEMBER",
  206. /* Polish    22 */  "STYCZEN",   "LUTY",        "MARZEC",    "KWIECIEN",
  207.                "MAJ",       "CZERWIEC",    "LIPIEC",    "SIERPIEN",
  208.                "WRZESIEN",  "PAZDZIERNIK", "LISTOPAD",  "GRUDZIEN",
  209. /* Portugese    23 */  "JANEIRO",   "FEVEREIRO",   "MARCO",     "ABRIL",
  210.                "MAIO",      "JUNHO",       "JULHO",     "AGOSTO",
  211.                "SETEMBRO",  "OUTUBRO",     "NOVEMBRO",  "DEZEMBRO",
  212. /* Romanian     24 */  "IANUARIE",  "FEBRUARIE",   "MARTIE",    "APRILIE",
  213.                "MAI",       "IUNIE",       "IULIE",     "AUGUST",
  214.                "SEPTEMBRIE","OCTOMBRIE",   "NOIEMBRIE", "DECEMBRIE",
  215. /* Russian    25 */  "YANVAR",    "FEVRAL",      "MART",      "APRYEL",
  216.                "MAY",       "YUN",         "YUL",       "AVGUST",
  217.                "SINTYABR",  "AKTYABR",     "NAYABR",    "DEKABR",
  218. /* Serbo-Croatian 26 */"JANUAR",    "FEBRUAR",     "MART",      "APRIL",
  219.                "MAJ",       "JUN",         "JULI",      "AVGUST",
  220.                "SEPTEMBAR", "OKTOBAR",     "NOVEMBAR",  "DECEMBAR",
  221. /* Spanish    27 */  "ENERO",     "FEBRERO",     "MARZO",     "ABRIL",
  222.                "MAYO",      "JUNIO",       "JULIO",     "AGOSTO",
  223.                "SEPTIEMBRE","OCTUBRE",     "NOVIEMBRE", "DICIEMBRE",
  224. /* Swahili    28 */  "JANUARI",   "FEBRUARI",    "MACHI",     "APRILI",
  225.                "MEI",       "JUNI",        "JULAI",     "AGOSTI",
  226.                "SEPTEMBA",  "OKTOBA",      "NOVEMBA",   "DESEMBA",
  227. /* Swedish    29 */  "JANUARI",   "FEBRUARI",    "MARS",      "APRIL",
  228.                "MAJ",       "JUNI",        "JULI",      "AUGUSTI",
  229.                "SEPTEMBER", "OKTOBER",     "NOVEMBER",  "DECEMBER",
  230. /* Texan    30 */  "JANYEWARY", "FEBYEWARY",   "MAHCH",     "AYEPRIL",
  231.                "MEYE",      "CHEWN",       "CHEW-LIE",  "AWGUST",
  232.                "SEPTEMBUH", "AWKTOBUH",    "NOVEMBUH",  "DEESEMBUH",
  233. /* Turkish    31 */  "OCAK",      "SUBAT",       "MART",      "NISAN",
  234.                "MAYIS",     "HAZIRAN",     "TEMMUZ",    "AGUSTOS",
  235.                "EYLUL",     "EKIM",        "KASIM",     "ARALIK",
  236. /* Yiddish    32 */  "YANUAR",    "FEBRUAR",     "MERTS",     "APRIL",
  237.                "MAI",       "YUNI",        "YULI",      "OIGUST",
  238.                "SEPTEMBER", "OKTOBER",     "NOVEMBER",  "DETSEMBER"
  239.       } ;
  240.  
  241.  
  242.  
  243. /* Put names of days into array */
  244. char *wkday[][7] =
  245.        {
  246. /* Afrikaans    0 */    "SONDAG",    "MAANDAG",    "DINSDAG",
  247.             "WOENSDAG",    "DONDERDAG",    "VRYDAG",
  248.             "SATERDAG",
  249. /* Arabic    1 */    "AL-AHAD",    "AL-ITSNAIN",    "AL-TSOULATSA",
  250.             "AL-ARBAA",    "AL-CHAMIS",    "AL GOUMAA",
  251.             "AL-SABT",
  252. /* Cantonese    2 */    "LAI-BAAI",    "YAT",        "YEE",
  253.             "SAAM",        "SAY",        "NG",
  254.             "LOOK",
  255. /* Czech    3 */    "NEDELE",    "PONDELI",    "UTERY",
  256.             "STREDA",    "CTVRTEK",    "PATEK",
  257.             "SOBOTA",
  258. /* Danish    4 */    "SONDAG",    "MANDAG",    "TIRSDAG",
  259.             "ONSDAG",    "TORSDAG",    "FREDAG",
  260.             "LORDAG",
  261. /* Dutch    5 */    "ZONDAG",    "MAANDAG",    "DINSDAG",
  262.             "WOENSDAG",    "DONDERDAG",    "VRIJDAG",
  263.             "ZATERDAG",
  264. /* English    6 */    "SUNDAY",    "MONDAY",    "TUESDAY",
  265.             "WEDNESDAY",    "THURSDAY",    "FRIDAY",
  266.             "SATURDAY",
  267. /* Esperanto    7 */    "DIMANCO",    "LUNDO",    "MARDO",
  268.             "MERKREDO",    "JAUDO",    "VENDREDO",
  269.             "SABATO",
  270. /* Finnish    8 */    "SUNNUNTAI",    "MAANANTAI",    "TIISTAI",
  271.             "KESKIVIIKKO",    "TORSTAI",    "PERJANTAI",
  272.             "LAUANTAI",
  273. /* French    9  */    "DIMANCHE",    "LUNDI",    "MARDI",
  274.             "MERCREDI",    "JEUDI",    "VENDREDI",
  275.             "SAMEDI",
  276. /* Gaelic    10 */    "DOMHNAICH",    "LUAIN",    "MAIRT",
  277.             "CIADAIN",    "ARDAOIN",    "HAOINE",
  278.             "SATHURNA",
  279. /* German    11 */    "SONNTAG",    "MONTAG",    "DIENSTAG",
  280.             "MITTWOCH",    "DONNERSTAG",    "FREITAG",
  281.             "SONNABEND",
  282. /* Greek    12 */    "KYRIAKI",    "DEFTE'RA",    "TRI'TI",
  283.             "TETA'RTI",    "PEM'PTI",    "PARASKEVI",
  284.             "SA-VVATON",
  285. /* Hebrew    13 */    "RISCHON",    "SCHENI",    "SCHELISCHI",
  286.             "REVIIE",    "CHAMISCHI",    "SCHISCHI",
  287.             "SCHABAT",
  288. /* Hungarian    14 */    "VASARNAP",    "HETFO",    "KEDD",
  289.             "SZERDA",    "CSUTORTOK",    "PENTEK",
  290.             "SZOMBAT",
  291. /* Indonesian    15 */    "AHAD",        "SENIN",    "SELASA",
  292.             "REBO",        "KEMIS",    "DJUMAHAT",
  293.             "SABTU",
  294. /* Irish    16 */    "DOMHNACH",    "LUAN",        "MHAIRT",
  295.             "CHEADOIN",    "DEARDAOIN",    "AOINE",
  296.             "SATHARN",
  297. /* Italian    17 */    "DOMENICA",    "LUNEDI",    "MARTEDI",
  298.             "MERCOLEDI",    "GIOVEDI",    "VENERDI",
  299.             "SABATO",
  300. /* Japanese    18 */    "NICHIYOBI",    "GETSUYOBI",    "KAYOBI",
  301.             "SUIYOBI",    "MOKUYOBI",    "KIN'YOBI",
  302.             "DOYOBI",
  303. /* Korean    19 */    "IL-YO-IL",    "WOL-YO-IL",    "HWA-YO-IL",
  304.             "SU-YO-IL",    "MOK-YO-IL",    "KUM-YO-IL",
  305.             "T'O-YO-IL",
  306. /* Latin          "DOMINICUS",    "LUNES",    "MIUS",
  307.             "",        "",        "",
  308.             "", */
  309. /* Mandarin     20 */    "TIAN XING QI",    "YI XING QI",    "ER XING QI",
  310.             "SAN XING QI",    "SI XING QI",    "WU XING QI",
  311.             "LU XING QI",
  312. /* Norwegian    21 */    "SONDAG",    "MANDAG",    "TIRSDAG",
  313.             "ONSDAG",    "TORSDAG",    "FREDAG",
  314.             "LORDAG",
  315. /* Polish    22 */    "NIEDZIELA",    "PONIEDZIALEK",    "WTOREK",
  316.             "SRODA",    "CZWARTEK",    "PIATEK",
  317.             "SOBOTA",
  318. /* Portugese    23 */    "DOMINGO",    "SEGUNDA-FEIRA","TERCA-FEIRA",
  319.             "QUARTA-FEIRA",    "QUINTA-FEIRA",    "SEXTA-FEIRA",
  320.             "SABADO",
  321. /* Romanian     24 */   "DUMINICA",     "LUNI",         "MARTI",
  322.             "MIERCURI",     "JOI",          "VINERI",
  323.             "SIMBATA",
  324. /* Russian    25 */    "VOSKRESYENYE",    "PANIDYELNIK",    "FTORNIK",
  325.             "SREDA",    "CHETVERK",    "PYATNITSA",
  326.             "SUBOTA",
  327. /* Serbo-Croatian 26 */    "NEDELJA",    "PONEDELJAK",    "UTORAK",
  328.             "SREDA",    "CETVRTAK",    "PETAK",
  329.             "SUBOTA",
  330. /* Spanish    27 */    "DOMINGO",    "LUNES",    "MARTES",
  331.             "MIERCOLES",    "JUEVES",    "VIERNES",
  332.             "SABADO",
  333. /* Swahili    28 */    "JUMAPILI",    "JUMATATU",    "JUMANNE",
  334.             "JUMATANO",    "ALHAMISI",    "IJUMAA",
  335.             "JUMAMOSI",
  336. /* Swedish    29 */    "SONDAG",    "MANDAG",    "TISDAG",
  337.             "ONSDAG",    "TORSDAG",    "FREDAG",
  338.             "LORDAG",
  339. /* Texan    30 */    "SUNNY",    "MONEY",    "TEWSDI",
  340.             "WEDDSDI",    "THIRSTY",    "FRAWDDI",
  341.             "SATTADI",
  342. /* Turkish    31 */    "PAZAR",    "PAZARTESI",    "SALI",
  343.             "CARSAMBA",    "PERSEMBE",    "CUMA",
  344.             "CUMARTESI",
  345. /* Yiddish    32 */    "SUNTOG",    "MONTOG",    "DIENSTTOG",
  346.             "MITVOCH",    "DONNERSCHTOG",    "FREITOG",
  347.             "SCHABBES"
  348.       } ;
  349.  
  350.  
  351.  
  352. /* Hebrew - based on solar years and lunar months.
  353.    shelema - 355 days - complete year, with Heshvan & Keslev having 30 days.
  354.    sedur   - 354 days - normal year, Heshvan is defective (29 days).
  355.    hasera  - 353 days - Heshvan & Kislev both defective (29 days).
  356.    The 11 days by which the solar year (365 days) exceeds the lunar year
  357.    (354 days) are accounted for by having a 13th month (Veadar of 30 days)
  358.    on the 3rd, 6th, 8th, 11th, 14th, and 17th year of a 19 year cycle.
  359.  
  360.     "TISHRI", 30,    "HESHVAN", 29/30,    "KISLEV", 29/30,
  361.     "TEBET", 29,    "SHEBAT", 30,        "ADAR", 30,    "VEADAR", 30
  362.     "NISAN", 30,    "IYAR", 29,        "SIVIAN", 30,
  363.     "TAMMUZ", 29,    "AB", 30,        "ELUL", 29
  364. */
  365.  
  366. int yr[3][12][6][7];            /* Array for 3 yrs, 4-D, */
  367.                     /* 3 years,      12 months/year, */
  368.                     /* 6 weeks/month, 7 days/week */
  369.  
  370. char *new_file  = "DATAFILE.$$$";
  371. char *file      = "DATAFILE.CAL";
  372. FILE *fp;
  373.  
  374.  
  375.  
  376. void main(int argc, char *argv[])
  377. {
  378.   int bd,                /* Beg day passed to functions */
  379.       bm,                   /* Beg month passed to functions */
  380.       by,                /* Beg year passed to functions */
  381.       fy_bm,                /* Fiscal year beginning month */
  382.       fy_bd,                /* Fiscal year beginning date */
  383.       i,
  384.       j,
  385.       year;
  386.  
  387.   char c,
  388.        outp;
  389.  
  390.   struct date today;            /* Template date defined in */
  391.                     /* <dos.h> from Borland */
  392.   get_opts(argv[0]);
  393.   signon();
  394.  
  395.     getdate(&today);            /* Get DOS's idea of date */
  396.                     /* DOS specific. . . */
  397.     fy_bd = today.da_day;        /* Make it today */
  398.     fy_bm = today.da_mon;        /* Make it this month */
  399.     year  = today.da_year;        /* It was a very good year. . . */
  400.  
  401.   for ( ;; )
  402.   {
  403.     fprintf(stderr,
  404. "\nSchedule period to be <A>nnual, <M>onthly, <W>eekly, or <D>aily (A/M/W/D)? %c\b",
  405.                Opt.sched_type ?
  406.                Opt.sched_type :
  407.                'A'              );
  408.     for ( ;; )
  409.     {
  410.     c = toupper(getch());
  411.  
  412.     switch(c)
  413.     {
  414.         case  'M'  : break;
  415.         case  'W'  : break;
  416.         case  'D'  : break;
  417.         case  'A'  : break;
  418.         case '\033': exit(0);
  419.         case '\r'  :
  420.         case '\n'  : c = (Opt.sched_type == FALSE) ?
  421.                             'A':
  422.                      Opt.sched_type;
  423.         default    : ;
  424.     }
  425.  
  426.     if ( c == 'M' ||
  427.          c == 'W' ||
  428.          c == 'D' ||
  429.          c == 'A'  )
  430.     {
  431.         Opt.sched_type = c;
  432.         putch(c);
  433.  
  434.         if (Opt.sched_type == 'A')
  435.         Opt.sched_type = FALSE;
  436.  
  437.         break;
  438.     }
  439.  
  440.     continue;
  441.     }
  442.  
  443.     if (Opt.sched_type == 'D' ||    /* Schedule what sort of time? */
  444.     Opt.sched_type == 'W'  )
  445.     {
  446.     fputs("\nUse 24-hour time format", stderr);
  447.     Opt.mil = get_yn(Opt.mil ? 'y' :
  448.                    'n'   );
  449.     }
  450.  
  451.     fputs("\nType year desired for calendar (1582-4000): ", stderr);
  452.     year = get_int(year, 4, 1582, 4000);
  453.  
  454.     fprintf(stderr, "\nHow many successive %ss? (0-99): ",
  455.         Opt.sched_type == 'M' ? "month" :
  456.         Opt.sched_type == 'W' ? "week"  :
  457.         Opt.sched_type == 'D' ? "day"   :
  458.                     "year"   ) ;
  459.     Opt.more_yrs = get_int(Opt.more_yrs, 2, 0, 99);
  460.  
  461.     if (!Opt.sched_type)
  462.     {
  463.     fputs("\nDo you want an Aggie Calendar", stderr);
  464.     Opt.aggie = get_yn(Opt.aggie ?
  465.                  'y' :
  466.                  'n');
  467.     }
  468.  
  469.     if (!Opt.aggie)
  470.     {
  471.     if (!Opt.sched_type)
  472.     {
  473.         fputs("\nDo you want a 3-digit Julian Calendar", stderr);
  474.         Opt.julian = get_yn(Opt.julian ? 'y' :
  475.                          'n'  );
  476.     }
  477.  
  478.     if (! (Opt.julian | Opt.sched_type) )
  479.     {
  480.         fputs("\nFiscal year calendar ", stderr);
  481.         Opt.fy = get_yn(Opt.fy ? 'y' :
  482.                      'n'  );
  483.     }
  484.  
  485.     if (Opt.fy | Opt.sched_type)
  486.     {
  487.         fprintf(stderr, "\n%s beginning month (1-12): ",
  488.         Opt.sched_type == 'M' ?  "Monthly calendar" :
  489.         Opt.sched_type == 'W' ?  "Weekly schedule"  :
  490.         Opt.sched_type == 'D' ?  "Daily schedule"   :
  491.                      "Fiscal year"       );
  492.  
  493.         /* make month J=0, F=1, . . . D=11 */
  494.         fy_bm = get_int(fy_bm, 2, 1, 12);
  495.  
  496.         if (Opt.sched_type != 'M')
  497.         {
  498.         fprintf(stderr, "\n%s beginning date  (1-31): ",
  499.             Opt.sched_type == 'W' ? "Weekly schedule" :
  500.             Opt.sched_type == 'D' ? "Daily schedule"  :
  501.                         "Fiscal year"       );
  502.  
  503.         fy_bd = get_int(fy_bd, 2, 1, 31);
  504.         }
  505.         else
  506.         fy_bd = 1;            /* Make months start on first */
  507.     }
  508.     }   /* Endif (!Opt.aggie) */
  509.     else                 /* Opt.aggie) */
  510.     Opt.sched_type = Opt.julian = Opt.fy = FALSE;
  511.  
  512.     if (Opt.sched_type        &&
  513.     Opt.sched_type != 'M'  )
  514.     {
  515.     fprintf(stderr, "\n%s schedule beginning hour  (0-23): ",
  516.         Opt.sched_type == 'W' ? "Weekly" :
  517.                     "Daily"   );
  518.  
  519.     Opt.bh = get_int(Opt.bh, 2, 0, 23);
  520.  
  521.     fprintf(stderr, "\n%s schedule number of hours (1-24): ",
  522.         Opt.sched_type == 'W' ? "Weekly" :
  523.                     "Daily"   );
  524.     Opt.nh = get_int(Opt.nh, 2, 1, 24);
  525.     }
  526.  
  527.     if (Opt.sched_type)
  528.     {
  529.     fputs(
  530.     "\n\nYou may enter up to five custom title lines for the schedules."
  531.     "\nThe first three titles entered will be printed on the top three lines."
  532.     "\nThe last two titles will be printed below the date titles.", stderr);
  533.  
  534.     for (i = 0;
  535.          i < 8;
  536.          i++  )
  537.     {
  538.         if (i == 3)
  539.         {
  540.         fputs("\nTitles #4, #5, and #6 are used for dates.", stderr);
  541.         i = 6;            /* So skip to Title #7 */
  542.         }
  543.         fprintf(stderr,
  544.       "\nTitle #%d currently is (RETURN to keep it the same, SPACE to erase):",
  545.         i + 1);
  546.         fprintf(stderr, "\nTitle #%d: %s",
  547.                       i + 1,
  548.                       Opt.title[i][0] ?
  549.                       Opt.title[i]    :
  550.                       "\t(No title currently defined)" );
  551.         fprintf(stderr, "\nTitle #%d: ", i + 1);
  552.         gets(Opt.title[4]);
  553.  
  554.         if (Opt.title[4][0] != '\0')
  555.         strcpy(Opt.title[i], Opt.title[4]);
  556.     }
  557.     }
  558.  
  559.     fputs("\nProgrammer's Calendar", stderr);
  560.     i = get_yn(Opt.base ?
  561.             'y' :
  562.             'n');
  563.  
  564.     if (!i)                /* Decimal numbers used */
  565.     Opt.base = FALSE;
  566.     else                /* Hexadecimal or Octal numbers */
  567.     {
  568.     fprintf(stderr,
  569.     "\n<H>exadecimal or <O>ctal numbering (H/O)? %c\b",
  570.                              (Opt.base == FALSE) ?
  571.                              'H'                 :
  572.                              Opt.base            );
  573.  
  574.     for ( ;; )
  575.     {
  576.         c = toupper(getch());
  577.  
  578.         switch(c)
  579.         {
  580.         case  'O': break;
  581.         case  'H': break;
  582.         case '\r':
  583.         case '\n': c = (Opt.base == FALSE) ?
  584.                            'H' :
  585.                            Opt.base;
  586.                break;
  587.         default  : c = '?';
  588.         }
  589.  
  590.         if ( c == 'H' ||
  591.          c == 'O'  )
  592.         {
  593.         putch(c);
  594.         Opt.base = c;
  595.         break;
  596.         }
  597.  
  598.         continue;
  599.     }
  600.     }
  601.  
  602.     fputs("\nThe calendar(s) may be composed in several languages:\n\t",
  603.         stderr);
  604.  
  605.     for (i = 0;
  606.      i < lingos;
  607.      i++)
  608.     {
  609.     if (!(i % 3))
  610.         fputs("\n\t", stderr);
  611.  
  612.     fprintf(stderr, "<%2d> = %-15s",
  613.              i + 1, lingo[i]);
  614.     }
  615.  
  616.  
  617.     fprintf(stderr, "\nWhich language for this calendar? (1-%d): ",
  618.                                 lingos);
  619.     Opt.lang = get_int(Opt.lang, 2, 1, lingos);
  620.  
  621.     if (Opt.sched_type)        /* IBM line drawing sets useful only */
  622.                 /*   in M/W/D schedules at this time */
  623.     {
  624.     fputs(
  625.     "\n\nYou may optionally use IBM line-drawing characters for the borders.\n"
  626.  
  627.     "\n\t<0> = ASCII characters, which will work with most printers."
  628.     "\n\t    The following use IBM extended graphic characters."
  629.     "\n\t<1> = Single line top/bottom, sides, and inside."
  630.     "\n\t<2> = Double line top/bottom, sides, and 1-line inside."
  631.     "\n\t<3> = Double line top/bottom, sides, and inside."
  632.     "\n\t<4> = Single line top/bottom, 2-line sides, and 1-line inside."
  633.     "\n\t<5> = Double line top/bottom, 1-line sides and inside."
  634.     "\n\t<6> = Single line top/bottom, 2-line sides and inside."
  635.     "\n\t<7> = Double line top/bottom, 1-line sides, and 2-line inside."
  636.  
  637.     "\n\nType # of Line Drawing Character set to use (0-7): ", stderr);
  638.     Opt.lds = get_int(Opt.lds, 1, 0, 7);
  639.     }
  640.  
  641.     fputs("\n<V>iew, <P>rint, or write to <F>ile(s) (V/P/F)? V\b", stderr);
  642.  
  643.     for ( ;; )
  644.     {
  645.     c = toupper(getch());
  646.  
  647.     switch(c)
  648.     {
  649.         case  'F'  : outp = 'F'; break;
  650.         case  'P'  : outp = 'P'; break;
  651.         case '\033': exit(0);
  652.         case '\r'  :
  653.         case '\n'  :
  654.         case  'V'  : outp = 'V'; break;
  655.         default    : outp = '?';
  656.     }
  657.  
  658.     if (outp == 'F' ||
  659.         outp == 'V' ||
  660.         outp == 'P'  )
  661.     {
  662.         putch(c);
  663.         break;
  664.     }
  665.  
  666.     continue;
  667.     }
  668.  
  669.     if (Opt.sched_type)        /* Page width/length useful only */
  670.                 /* in M/W/D schedules at this time */
  671.     {
  672.     if (outp == 'P' ||    /* We want hardcopy */
  673. /*          outp == 'V' ||       * He wants to look at it */
  674.         outp == 'F'  )    /* He wants a file */
  675.     {
  676.         fputs("\nType # of lines for each page (51-132): ",
  677.         stderr);
  678.         Opt.pl = get_int(Opt.pl, 3, 51, 132);
  679.  
  680.         fputs("\nType # of characters for each line (40-270): ",
  681.         stderr);
  682.         Opt.pw = get_int(Opt.pw, 3, 40, 270);
  683.  
  684.         fputs("\nType # of spaces for left margin indent (0-40): ",
  685.         stderr);
  686.         Opt.indent = get_int(Opt.indent, 2, 0, 40);
  687.     }
  688.     }   /* endif Opt.Sched_type) */
  689.  
  690.     if (outp == 'P')        /* Hardcopy selected */
  691.     {
  692.     fprintf(stderr,
  693.     "\nType # of copies desired of each %s (1-999): ",
  694.              (Opt.sched_type == 'M') ? "month" :
  695.              (Opt.sched_type == 'W') ? "week"  :
  696.              (Opt.sched_type == 'D') ? "day"   :
  697.                            "year"  );
  698.     Opt.copies = get_int(Opt.copies, 3, 1, 999);
  699.  
  700.     fputs("\nPause after each page", stderr);
  701.     Opt.pause = get_yn(Opt.pause ?
  702.                  'y' :
  703.                  'n' );
  704.     }
  705.  
  706.     setup_files(outp);
  707.  
  708.     by = year;
  709.     bm = fy_bm - 1;
  710.     bd = fy_bd;
  711.  
  712.     for (i = 0;
  713.      i < Opt.more_yrs + 1;
  714.      i++, Opt.sched_type == 'M' ? bm++   :
  715.           Opt.sched_type == 'W' ? bd += 7:
  716.           Opt.sched_type == 'D' ? bd++   :
  717.                       by++    )
  718.     {
  719.     if (leap(by))            /* Tidy up month length array */
  720.         mon[1].length = 29;     /* For this year by fixin' Feb. . . */
  721.     else
  722.         mon[1].length = 28;
  723.  
  724.     if (bd > mon[bm].length)    /* Past this End Of Month */
  725.     {
  726.         bd -= mon[bm].length;    /* So make it appropriate day. . . */
  727.         bm++;            /* Of following month. . . */
  728.     }
  729.  
  730.        if (bm > 11)            /* Egad! We are past December. . . */
  731.        {
  732.         bm = bm % 12;        /* Normalise it. . . */
  733.  
  734.         if (bm == 0)        /* Now have January? J=0, F=1 D=11 */
  735.         by++;            /* Ratchet the year. . . */
  736.        }
  737.  
  738.     if (!Opt.julian)        /* Prepare the calendar arrays */
  739.         prep_cal(by);
  740.  
  741.     for ( j = 0;
  742.           j < Opt.copies;
  743.           j++)
  744.     {
  745.         if (Opt.sched_type)
  746.         sched_printer(by,             outp,      bm,
  747.                   bd,             Opt.bh,    Opt.nh,
  748.                   Opt.pl,         Opt.pw,    Opt.sched_type,
  749.                   Opt.title,
  750.                   Opt.base,       Opt.lang,  Opt.pause,
  751.                   Opt.indent,     Opt.lds  );
  752.         else
  753.         if (Opt.julian)
  754.         jul_printer(by,       outp,
  755.                 Opt.base, Opt.lang, Opt.pause );
  756.         else
  757.         if (Opt.aggie)
  758.         agg_printer(by,       outp,
  759.                 Opt.base, Opt.lang, Opt.pause );
  760.         else
  761.         if (Opt.fy)
  762.         cal_printer(by,       outp,     bm,
  763.                 Opt.fy,   bd,
  764.                 Opt.base, Opt.lang, Opt.pause );
  765.         else
  766.         cal_printer(by,       outp,     0,
  767.                 Opt.fy,   1,
  768.                 Opt.base, Opt.lang, Opt.pause);
  769.     }
  770.     }
  771.  
  772.     fputs("\nAnother calendar", stderr);
  773.  
  774.     if (!get_yn('n'))
  775.     {
  776.     if (outp != 'F')
  777.         fclose(fp);
  778.  
  779.         fputs("\nRetain present options as defaults", stderr);
  780.  
  781.     if (get_yn('n'))
  782.             put_opts(argv[0]);
  783.  
  784.     exit(0);
  785.     }
  786.   }
  787. }
  788.  
  789.  
  790.  
  791.